Sequelize
✒️ 2025-06-29 21:39 내용 수정
ORM(Object-Relational Mapping) 라이브러리
- 공식 사이트 : https://sequelize.org/docs/v6/
- ORM(Object Relation Mapping) : Javascript 객체와 데이터베이스의 관계를 매핑해줌으로써 Javascript 구문으로 작성한 내용을 SQL로 변환해준다.
Sequelize-cli는 Model을 먼저 생성하고 그 후에 DB로 옮긴다.Sequelize-auto는 DB에 먼저 테이블을 만들고, 그 후에 Model을 자동 생성해준다.
초기설정
- npx 명령어로 모델과 테이블 생성의 초기 설정과 동일하다.
- VSC 터미널에서
npm i sequelize sequelize-cli으로 ORM 관련 패키지를 설치한다. - 만약 mysql2가 설치되어 있지 않다면
npm i mysql2로 mysql2도 설치한다.

- VSC 터미널에서
npx sequelize init로 sequelize를 실행해 초기 설정을 해준다.

- 명령어 생성 후 생긴 config 폴더의 config.json 파일에서 DB를 용도별로 설정할 수 있다.
- 개발을 위한 db 연결을 설정하는데, 기존에 없던 db라면 새로 생성해준다.
- development : 개발을 위한 DB
- test : 테스트를 위한 DB
- production : 실제 배포나 서비스를 위한 DB
{
"development": { // 개발용 DB
"username": "사용자",
"password": "비밀번호",
"database": "DB이름",
"host": "127.0.0.1", // localhost
"dialect": "mysql",
"port" : "3306" // port가 기본값이 아니라면 지정 필요
},
"test": { // 테스트용 DB
"username": "사용자",
"password": "비밀번호",
"database": "DB이름",
"host": "127.0.0.1", // localhost
"dialect": "mysql"
},
"production": { // 배포 및 서비스를 위한 DB
"username": "사용자",
"password": "비밀번호",
"database": "DB이름",
"host": "127.0.0.1", // localhost
"dialect": "mysql"
}
}

Sequelize 인스턴스 생성
- DB에 연결하려면 Sequelizse 인스턴스를 생성해야 한다.
- Sequelize 생성자에 연결 설정과 관련된 매개변수를 넘겨주거나 연결용 url을 사용해서 생성할 수 있다.
- 매개변수는 Sequelize instance constructor params 참고.
const { Sequelize } = require('sequelize');
// 연결용 url 사용
const sequelize = new Sequelize('connection url');
// 연결을 위한 매개변수 전달
const sequelize = new Sequelize('database', 'username', 'password', {
// option에는 객체로 전달
host : 'localhost',
dialect : 'mysql',
port : '3306'
});
- 연결을 확인할 땐 try-catch문에서
sequelize.authenticate()를 사용한다.
try {
sequelize.authenticate();
console.log('연결 성공');
} catch (error) {
console.error('연결 실패');
}
- Sequelize는 DB연결을 기본적으로 계속 연결 시켜두며, 모든 쿼리에 대해 같은 연결을 사용한다.
- 연결을 종료할 때는
sequelize.close()를 사용하여 종료할 수 있고, 비동기 함수에 Promise를 반환한다.
sequelize config 수정하기
- models 폴더에 index.js 파일은 Sequelize 객체 인스턴스를 생성해서 DB로 연결하는 내용을 담고 있다.
- server.js에서 mysql2로 DB에 연결해서 데이터를 받아 오던 것을 sequelize에서 미리 연결을 설정해서 모듈로 사용하는 것으로 대체할 수 있다.
- 설정 참고 자료 : Sequelize Model Basics
- config 폴더의 config.json 파일에서 사용하려는 DB의 설정을 확인한다.
- 기본값은 3306으로, 기본값이 아닌 포트를 사용 중이라면 꼭 추가해야 DB와 연결된다.
- 각 항목을 나중에 index.js에서 설정할 때 사용할 예정이다.
{
"development": {
"username": "root",
"password": "비밀번호",
"database": "DB이름",
"host": "127.0.0.1",
"dialect": "mysql",
"port" : "3307" // 기본값은 3306으로, 기본값이 아닌 포트를 사용 중이라면 꼭 추가
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
- models 폴더에서 모델 파일의 내용을 모듈화할 수 있도록 수정한다.
- 모델은 Model 참고.
- require exports 참고.
// customModelfile.js
'use strict'; // strict mode 사용
const { Model } = require('sequelize'); // Model 클래스 상속을 위해 가져오기
module.exports = (sequelize, DataTypes) => { // (sequelize, DataTypes)는 다른 파일에 존재
class CustomModel extends Model {} // 테이블 클래스가 Model 클래스를 상속받음
CustomModel.init({
// Model attribute 설정
columnName1 : { // 추가할 테이블의 컬럼명으로 지정
type : DataTypes.STRING, // 데이터 타입 지정
allowNull : false
},
columnName2 : {
type : DataTypes.INTEGER,
allowNull : true
},
columnName3: DataTypes.STRING, // 다른 옵션이 없다면 간단하게 타입만 작성
columnName4: DataTypes.STRING
}, {
sequelize, // DB 연결에 필요한 sequelize 인스턴스
modelName: 'ModelName',
});
return CustomModel; // ModelName 클래스를 다른 파일로 전달
};

- index.js 파일에서 Sequelize 인스턴스를 만들어 DB 연결 설정을 해주고, 모델 파일에서 함수를 가져와 CustomModel 인스턴스를 만든다.
// index.js
'use strict';
const Sequelize = require('sequelize'); // Sequelize 사용
const config = require('../config/config.json'); // DB 설정이 있는 config.json 파일 가져옴
// config.json 파일의 development 객체의 properties를 변수에 저장
const {username, password, database, host, dialect, port} = config.development;
// Sequelize 인스턴스 생성
const sequelize = new Sequelize(database, username, password, {host, dialect, port}); // port 설정을 했다면 port도 전달
// customModelfile에 있는 함수 호출, sequelize와 Sequelize.DataTypes를 전달해서 CustomModel 인스턴스 생성
const CustomModel = require('./customModelfile')(sequelize, Sequelize.DataTypes);
const db = {} // db 객체 만들기
db.CustomModel = CustomModel; // db 객체에 CustomModel 저장
module.exports = db; // db 객체 내보내기

- server.js 파일이 없다면 새로 만들고, 기존에 mysql2로 연동했던 파일이 있으면 파일을 수정한다.
// 1. require
const express = require('express');
const app = express();
// ORM을 통한 DB 접속
const db = require('./models/index'); // index.js에서 내보낸 db 객체 가져오기
const { CustomModel } = db; // db 객체에 있는 CustomModel 저장하기
// 2. use, set
app.use(express.static(__dirname + "/public"));
app.set('view engine', 'ejs');
app.use(express.json());
app.use(express.urlencoded({'extended':'true'}));
// 3. listen
app.listen('8080', () => {
console.log('접속 http://localhost:8080');
});
// 4. routing
app.get('/', (request, response) => {
response.render('main.ejs');
});
// db에서 가져온 정보를 웹 페이지에 보여주기 위해 라우팅과 데이터 포워딩 설정
app.get('/customModel', async (request, response) => {
const { param } = request.query; // request의 query string을 저장
// 특정 query string의 여부에 따라 검색 결과를 다르게 설정
if (param != null) { // query string이 있을 때
const customParamResult = await CustomModel.findAll({where:{param}}); // SELECT * FROM table WHERE param = x;
// where : {cols: request.query}
response.render('custom.ejs', { customData: customParamResult });
} else { // query string이 없을 때
const customResult = await CustomModel.findAll(); // SELECT * FROM table;
response.render('custom.ejs', { customData: customResult });
}
});

- 이제 DB에서 가져온 데이터를 보여줄 페이지를 간단하게 만든다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
table{
border: 1px solid black;
border-collapse: collapse;
text-align: center;
}
th, td{border: 1px solid black;}
</style>
</head>
<body>
<section class="sec">
<div class="container">
<div class="row">
<div class="col">
<table>
<tr>
<th>id</th>
<th>이름</th>
<th>부서</th>
<th>직종</th>
<th>이메일</th>
<th>전화번호</th>
</tr>
<% for(let i = 0; i < employee.length; i++) { %>
<tr>
<td><%= employee[i].id %></td>
<td><%= employee[i].name %></td>
<td><%= employee[i].team %></td>
<td><%= employee[i].position %></td>
<td><%= employee[i].emailAddress %></td>
<td><%= employee[i].phoneNumber %></td>
</tr>
<% } %>
</table>
</div>
</div>
</div>
</section>
</body>
</html>

